import java.util.HashMap;

/**
 * @作者 钟先崟
 * @时间 2023-03-06 17:24
 * @说明 3. 无重复字符的最长子串
 * 给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。
 * 示例 1:
 * 输入: s = "abcabcbb"
 * 输出: 3
 * 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
 */
public class Solution {
    public static void main(String[] args) {
//        System.out.println(lengthOfLongestSubstring("abcabcbb"));
//        System.out.println(lengthOfLongestSubstring("bbbbbb"));
//        System.out.println(lengthOfLongestSubstring("pwwkew"));
//        System.out.println(lengthOfLongestSubstring(" "));
        System.out.println(lengthOfLongestSubstring("bbtablud"));
    }

    /**
     * 执行用时：5 ms , 在所有 Java 提交中击败了58.24% 的用户
     * 内存消耗：41.6 MB , 在所有 Java 提交中击败了60.21%的用户
     *
     * @param s
     * @return
     */
    public static int lengthOfLongestSubstring(String s) {
        int maxLen = 0;
        HashMap<Character, Integer> hashMap = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            Integer integer = hashMap.get(s.charAt(i));
            if (integer == null) {
                hashMap.put(s.charAt(i), i);
            } else {
                if (maxLen < hashMap.size()) maxLen = hashMap.size();
                hashMap.replace(s.charAt(i), i);
                for (int j = integer - 1; j >= 0; j--) {
                    boolean remove = hashMap.remove(s.charAt(j), j);
                    if (remove == false) {
                        break;
                    }
                }
            }
        }
        if (maxLen < hashMap.size()) maxLen = hashMap.size();
        return maxLen;
    }
}
